
#include "HardWare/sysDelay.h"

static uint32_t g_fac_us = 0;       /* us延时倍乘数 */

void delay_init(uint16_t sysclk)
{
    SysTick->CTRL=0x00;
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);
    g_fac_us=sysclk/8;

}

void delay_us(uint32_t nus)
{
    uint32_t  temp;
    SysTick->LOAD=nus*g_fac_us;
    SysTick->VAL=0x00;
    SysTick->CTRL|=1<<0;

    do {
        temp=SysTick->CTRL;
    } while ((temp&0x01)&&!(temp&(1<<16)));

    SysTick->CTRL&=~(1<<0); // 关闭systick
    SysTick->VAL=0x00;      // 清空计数器

}
void delay_ms(uint16_t xms)
{
    uint32_t repeat = xms/1000; // 考虑到应用可能超频
    uint32_t  remain = xms%1000;
    while (repeat)
    {
        delay_us(1000*1000);
        repeat--;
    }
    if(remain)
    {
        delay_us(remain*1000);
    }
}

#if 0
/**
  * @brief  微秒级延时
  * @param  xus 延时时长，范围：0~233015
  * @retval 无
  */
void delay_us(uint32_t xus)
{
    SysTick->LOAD = 72 * xus;				//设置定时器重装值
    SysTick->VAL = 0x00;					//清空当前计数值
    SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK，启动定时器
    while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
    SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长，范围：0~4294967295
  * @retval 无
  */
void delay_ms(uint32_t xms)
{
    while(xms--)
    {
        delay_us(1000);
    }
}

/**
  * @brief  秒级延时
  * @param  xs 延时时长，范围：0~4294967295
  * @retval 无
  */
void delay_s(uint32_t xs)
{
    while(xs--)
    {
        delay_ms(1000);
    }
}
#endif
void HAL_Delay(uint32_t Delay)
{
    delay_ms(Delay);
}